package lambda04;

import org.junit.Test;

/**
 * Lambda原理
 *   类似于匿名内部类的原理
 *   1.底层会Lambda表达式对应的接口的一个实现类
 *     每个Lambda表达式对应一个实现类,重写目标对应该Lambda表达式{}中内容
 *   2.当使用该Lambda表达式的时候,底层会创建该实现类对象
 */
public class LambdaDemo05 {
	@Test
	public void test01() {
		method("你好Lambda表达式",(String str)->{
			System.out.println(str);
		});
	}
	public void  method(String str, Printer p) {
		p.print(str);
	}

	@Test
	public void test02() {
		Printer p = str -> System.out.println(str);
		System.out.println(p);
		for (Class<?> in : p.getClass().getInterfaces()) {
			System.out.println(in);
		}
	}

	@Test
	public void test03() {
		Printer p = str -> System.out.println(str);//相当于 Printer p = new LambdaDemo05$$lambda$1();//多态
		p.print("abc");
	}
}
/*
  //在程序运行时期,会生成这个Lambda表达式对应的接口的一个实现类,并且重写接口中的抽象方法,重写目标对应该Lambda表达式{}中内容
  //  而且这个类是一个内部类
  // 每一个Lambda表达式对应一个实现类
  public class LambdaDemo05 {
	@Test
	public void test01() {
		method("你好Lambda表达式",new LambdaDemo05$$lambda$1());
	}
	public void  method(String str, Printer p) {//String str="你好Lambda表达式"
	                                            //Printer p= new LambdaDemo05$$lambda$1();//多态
		p.print(str);//最终相当于调用实现类中的print(String str)方法
	}

    //在程序运行时期,会生成这个Lambda表达式对应的接口的一个实现类
    class LambdaDemo05$$Lambda$1 implements Printer{
        //重写抽象方法
        public void print(String str){//String str="你好Lambda表达式"
	        System.out.println(str);//对应该Lambda表达式{}中内容
        }
    }
  }

*/
